/*
Copyright 2011 Mary Suárez Machado

Este programa es de software libre: usted puede redistribuirlo y/o modificarlo según los términos de la Licencia de Gran pública de GNU como publicado por la Fundación de Software Libre, versión 3 de la Licencia, (o en su opción) cualquier versión posterior.

 Este programa es distribuido en la esperanza que será útil, pero SIN CUALQUIER GARANTÍA; sin aún la garantía implícita de VALOR COMERCIAL O SALUD PARA UN OBJETIVO PARTICULAR. Mirar la Licencia de Gran pública de GNU para más detalles.
*/


#ifndef _TABLA_LONGITUD_H
#define _TABLA_LONGITUD_H

#include <VectorBits.h>

 /**
 *@file TablaLongitus.h
 *@brief Interfaz para trabajar con la tabla de bits adicionales para la codificación de las longitudes (LZ77)
 *
 */

 /**
 * \class TablaLongitud
 *
 * \brief Modulo que representa una tabla de codificación de bits adiccionales de longitudes (LZ77)
 *         
 * \author Mary Carmen Suárez 
 *
 */
	class TablaLongitud
	{
		private:
			int * codigo;
			int * nbits;
			int **longitud;
			TablaLongitud (const TablaLongitud & orig);
			TablaLongitud & operator= (const TablaLongitud & orig);
		public:
			/**
			@brief Constructor por defecto
			@pos crea la tabla rellena con los valores estandar
			*/
			TablaLongitud();
			/**
			@brief Destructor
			@pos libera toda la memoria reservada
			*/
			~TablaLongitud();
			/**
			@brief Escribe la tabla en la salida estandar
			*/
			void Escribir()const;
			/**
			@param l, longitud de la cual queremos saber su codigo asociado
			@return devuelve el codigo asociado a esa longitud
			*/
			int GetCodigo (int l) const;
			/**
			@param l, longitud de la cual queremos saber su numero de bits asociado
			@return devuelve el numero de bits asociado a esa longitud
			*/
			int GetBits (int l) const;
			/**
			@param l, longitud de la cual queremos saber el número de bits adicionales
			@return devuelve el numero de bits adicionales de esa longitud
			*/
			VectorBits GetBitsAdicionales (int l) const;
			/**
			@param l, longitud de la cual queremos saber el primer elemento del rango
			@return devuelve el primer elemento del rango de esa longitud
			*/
			int GetRangoLongitud (int l) const;
			/**
			@param cod, codigo del cual queremos saber el primer elemento del rango
			@return devuelve el primer elemento del rango de ese codigo
			*/
			int PrimerRango (int cod);
			/**
			@param cod, codigo del cual queremos saber su numero de bits asociado
			@return devuelve el numero de bits asociado a ese codigo
			*/
			int Nbits (int cod);

	};

#endif
